package com.knowledge.plus.反射;

/**
 * 反射获取class对象的四种方式 {@link GetReflectClass#getReflectClass()}

 * @author TPF
 * @since 2024/12/19
 */
public class GetReflectClass {

    private String value = "JavaGuide";

    public void publicMethod(String s) {
        System.out.println("调用了 public 方法： " + s);
    }

    private void privateMethod() {
        System.out.println("调用了 private 方法： " + value);
    }

    public void getReflectClass() throws ClassNotFoundException {
        /**
         * 1. 知道具体类的情况下可以使用：
         * 但是我们一般是不知道具体类的，基本都是通过遍历包下面的类来获取 Class 对象，
         * 通过此方式获取 Class 对象不会进行初始化
         */
        Class class1 = ReflectDemo.class;

        /**
         * 2. 通过 Class.forName()传入类的路径获取：
         */
        Class class2 = Class.forName("com.knowledge.plus.反射.ReflectDemo");

        /**
         * 3. 通过对象实例instance.getClass()获取：
         */
        ReflectDemo target = new ReflectDemo();
        Class class3 = target.getClass();

        /**
         * 4. 通过类加载器xxxClassLoader.loadClass()传入类路径获取:
         * 通过类加载器获取 Class 对象不会进行初始化，意味着不进行包括初始化等一些列步骤，静态块和静态对象不会得到执行
         */
        /*  在一个类中调用另一个类中static方法或变量时要使用 类名.方法名或者类名.属性名；
            如果调用的是非静态的方法或属性则要用类的对象去调用，即对象.方法或对象.属性。
         */
        // Class clazz = ClassLoader.loadClass("com.learning.plus.反射.ReflectDemo");
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        Class<?> class4 = classLoader.loadClass("class name");
    }

}
